package com.java.comminution.test1;

/**
 * 线程通信的例子：使用两个线程打印1-100，线程一，线程2 交替打印
 * 涉及到的三个方法：
 * 1。wait（） 一旦调用此方法，当前线程处于阻塞状态，并且释放同步监视器（锁）。
 * 2.notify（） 一旦执行此方法，就会唤醒被wait（）的一个线程。如果有多个线程被wait（），就唤醒优先级高的那个
 * 3.notifyAll（） 一旦执行此方法，就会唤醒所有被wait（）的线程
 * <p>
 * 说明：wait（）、notify（）  notifyAll（） 这三个方法必须使用在同步代码块或者同步方法中
 * wait（）、notify（）  notifyAll（） 这三个方法的调用者必须是同步方法或者同步代码块中的同步监视器
 * 否则会报异常
 * <p>
 * wait（）、notify（）  notifyAll（） 是定义在Object类中
 * <p>
 * 面试题： sleep（）方法和wait（）方法的异同
 * 相同点： 都会让线程处于阻塞状态。
 * 不同点： 1.两个位置声明的位置不同  sleep声明在Thread类中  ，wait声明在Object类中
 *
 * @author luzhikun
 * @date &{DATE}-20:41
 */
public class CommunicationTest {
    public static void main(String[] args) {
        Communication communication = new Communication();
        Thread thread = new Thread(communication);
        Thread thread1 = new Thread(communication);

        thread.setName("线程一");
        thread1.setName("线程二");

        thread.start();
        thread1.start();
    }
}

class Communication implements Runnable {
    private int numbber = 1;

    @Override
    public void run() {
//        for (int i=1;i<=50;i++){
//            synchronized (this) {
//                System.out.println(Thread.currentThread().getName()+numbber);
//                numbber++;
//            }
//        }
        while (true) {
            synchronized (this) {
                //就绪的线程唤醒阻塞的线程
                notify();
                if (numbber <= 100) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + numbber);
                    numbber++;
                    try {
                        //使得调用如下方法的线程处于阻塞状态，同时释放锁
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}
